package com.shujia.day14;

public class Demo02Synchronized2Clazz {
    public static void main(String[] args) {
        /*
            TODO
                由于对于同步代码块来说，如果给定的锁是一个对象，那么该对象可能在调用方调用时
                    给定多个对象，那么就失去了同步的意义  于是寻找唯一的一个类别 => 类
                总结：
                    可以在同步代码块中使用特定的类来锁定代码，但是当前的写法，使用的是静态变量
                        在有些场合下，不是很方便

         */

        new SynchronizedClazz("销售员1").start();
        new SynchronizedClazz("销售员2").start();

    }

    static class SynchronizedClazz extends Thread{
        public SynchronizedClazz(String name) {
            super(name);
        }

        @Override
        public void run() {
            while (true){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                // TODO 针对TicksNumClazz使用加锁操作 表示在同一时刻 有且只能使用一次该类
                synchronized (TicksNumClazz.class) {
                    if (TicksNumClazz.getNum() > 0) {
                        sell();
                    } else {
                        break;
                    }
                }
            }
        }
        public void sell() {
            System.out.println("当前售票员:" + Thread.currentThread().getName() + "正在销售第" + TicksNumClazz.getNum() + "票");
            TicksNumClazz.sellTick();
        }
    }
    static class TicksNumClazz {
        static int num = 100;

        public static void sellTick() {
            num -= 1;
        }

        public static int getNum() {
            return num;
        }
    }
}
